package com.softer.chengxin.score.util;

import com.softer.chengxin.common.enums.LevelEnum;
import com.softer.chengxin.common.util.DateFormatUtil;
import com.softer.chengxin.scheduled.dao.ScheduledTaskDao;
import com.softer.chengxin.score.dao.SDManagerDao;
import com.softer.chengxin.score.entity.ScoreDetail;
import com.softer.chengxin.score.entity.ScoreRecord;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author Gong Zhiyang
 * @date 2019/1/21
 */
@Service
public class ScoreUtil {
    @Autowired
    private SDManagerDao managerDao;
    @Autowired
    private ScheduledTaskDao scheduledTaskDao;

    /**
     * 修改企业record信息
     *
     * @param corpId 企业信息
     */
    public void updateRecord(Integer corpId) {
        //获取最近设置的定时任务
        String time = scheduledTaskDao.getTime();
        //获取主管部门定义的年份
        String year = DateFormatUtil.getYear(time);
        if (StringUtils.isNotBlank(year)) {
            //得到当前年度该企业的detail信息
            List<ScoreDetail> scoreDetails = managerDao.getScoreDetails(corpId);
            //得到该企业当前年度的record表信息
            ScoreRecord scoreRecord = managerDao.getScoreRecord(corpId, year);
            if (scoreRecord != null) {
                ScoreRecord sr = setScore(scoreDetails, scoreRecord, corpId, year);
                managerDao.updateScoreRecord(sr);
            } else {
                ScoreRecord sr = setScore(scoreDetails, new ScoreRecord(), corpId, year);
                managerDao.insertScoreRecord(sr);
            }
        }
    }

    public ScoreRecord setScore(List<ScoreDetail> scoreDetails, ScoreRecord scoreRecord, Integer corpId, String year) {
        //重新计算该企业各项得分
        BigDecimal jc01 = new BigDecimal(60);
        BigDecimal zero = new BigDecimal(0);
        scoreRecord.setJc01(jc01);
        scoreRecord.setJc02(zero);
        scoreRecord.setJc03(zero);
        scoreRecord.setJc04(zero);
        scoreRecord.setJc05(zero);
        scoreRecord.setJc06(zero);
        scoreRecord.setJc07(zero);
        scoreRecord.setYl01(zero);
        scoreRecord.setYl02(zero);
        scoreRecord.setYl03(zero);
        scoreRecord.setYl04(zero);
        scoreRecord.setYl05(zero);
        scoreRecord.setYl06(zero);
        scoreRecord.setYl07(zero);
        scoreRecord.setYl08(zero);
        scoreRecord.setFm01(zero);
        scoreRecord.setFm02(zero);
        scoreRecord.setFm03(zero);
        scoreRecord.setFm04(zero);
        scoreRecord.setFm05(zero);
        scoreRecord.setFm06(zero);
        scoreRecord.setFm07(zero);
        //计算优良负面得分
        count(scoreDetails, scoreRecord);

        //计算总得分
        BigDecimal allScore = countScore(scoreRecord);
        String dj = getLevel(allScore);
        scoreRecord.setAllScore(allScore);
        scoreRecord.setDj(dj);
        scoreRecord.setGmtModified(new Date());
        scoreRecord.setPoguid(corpId);
        scoreRecord.setYear(year);
        return scoreRecord;
    }

    /**
     * 计算优良负面得分
     *
     * @param scoreDetails 集合
     * @param scoreRecord  记录
     */
    private void count(List<ScoreDetail> scoreDetails, ScoreRecord scoreRecord) {
        BigDecimal yl01 = new BigDecimal(0);
        BigDecimal fm01 = new BigDecimal(0);
        for (ScoreDetail scoreDetail : scoreDetails) {
            if (scoreDetail.getInfoType() != null) {
                switch (scoreDetail.getInfoType()) {
                    case 1:
                        yl01 = yl01.add(scoreDetail.getScore());
                        scoreRecord.setYl01(yl01);
                        break;
                    case 2:
                        fm01 = fm01.add(scoreDetail.getScore());
                        scoreRecord.setFm01(fm01);
                        break;
                    default:
                        break;
                }
            }
        }
    }

    /**
     * 计算总分
     */
    public BigDecimal countScore(ScoreRecord scoreRecord) {
        BigDecimal jcScore = scoreRecord.getJc01().add(scoreRecord.getJc02()).
                add(scoreRecord.getJc03()).add(scoreRecord.getJc04()).
                add(scoreRecord.getJc05()).add(scoreRecord.getJc06()).
                add(scoreRecord.getJc07());
        BigDecimal fmScore = scoreRecord.getFm01().add(scoreRecord.getFm02()).
                add(scoreRecord.getFm03()).add(scoreRecord.getFm04()).
                add(scoreRecord.getFm05()).add(scoreRecord.getFm06()).
                add(scoreRecord.getFm07());
        BigDecimal ylScore = scoreRecord.getYl01().add(scoreRecord.getYl02()).
                add(scoreRecord.getYl03()).add(scoreRecord.getYl04()).
                add(scoreRecord.getYl05()).add(scoreRecord.getYl06()).
                add(scoreRecord.getYl07()).add(scoreRecord.getYl08());
        BigDecimal allScore = jcScore.add(ylScore).subtract(fmScore);
        return allScore;
    }


    /**
     * 获取企业等级
     *
     * @param score 分数
     * @return 级别
     */
    public String getLevel(BigDecimal score) {
        BigDecimal sixty = new BigDecimal(60);
        BigDecimal eighty = new BigDecimal(80);
        BigDecimal ninety = new BigDecimal(90);

        if (score == null || score.compareTo(sixty) < 0) {
            return LevelEnum.D.getLevel();
        }
        if (score.compareTo(sixty) >= 0 && score.compareTo(eighty) < 0) {
            return LevelEnum.A.getLevel();
        }
        if (score.compareTo(eighty) >= 0 && score.compareTo(ninety) < 0) {
            return LevelEnum.AA.getLevel();
        }
        if (score.compareTo(ninety) >= 0) {
            return LevelEnum.AAA.getLevel();
        }
        return LevelEnum.A.getLevel();
    }

//------------------------------基础算分开始------------------------------------------------
//        //jc_02 企业固定员工人数
//        int personCount = corpDao.findCountPerson(corpId);
//        if (personCount < Common.HUNDRED) {
//            jc02 = new BigDecimal(Figure.HALF);
//        } else if (personCount >= Common.HUNDRED && personCount < Common.THREE_HUNDRED) {
//            jc02 = new BigDecimal(Figure.ONE);
//        } else if (personCount >= Common.THREE_HUNDRED) {
//            jc02 = new BigDecimal(Figure.TWO);
//        }
//        //jc_03
//        // 企业管理技术人员
//        //企业中级职称以上人数
//        int managerCount = corpDao.findCountManagerPerson(corpId);
//        if (managerCount >= Common.FIVE && managerCount < Common.TEN) {
//            jc03 = new BigDecimal(Figure.TWO);
//        } else if (managerCount >= Common.TEN && managerCount < Common.FIFTEEN) {
//            jc03 = new BigDecimal(Figure.THREE);
//        } else if (managerCount >= Common.FIFTEEN) {
//            jc03 = new BigDecimal(Figure.FOUR);
//        }
//        //jc_04
//        // 企业员工专业素质情况
//        //企业的项目负责人人数
//        Integer proManager = corpDao.getCountProManagerPerson(corpId);
//        //企业的项目负责人参加培训的人数
//        Integer proTrainManager = corpDao.getCountProManagerPersonTrain(corpId, year);
//        if (proManager != 0 && proTrainManager != 0) {
//            double ret = proTrainManager / proManager;
//            if (ret < 0.6) {
//                jc04 = new BigDecimal(Figure.ZERO);
//            } else if (ret >= 0.6 && ret < 0.8) {
//                jc04 = new BigDecimal(Figure.ONE);
//            } else if (ret >= 0.8) {
//                jc04 = new BigDecimal(Figure.TWO);
//            }
//        }
//        //企业的其他人员惨参加培训的人数
//        Integer proTrain = corpDao.getCountProPersonTrain(corpId, year);
//        BigDecimal proTrainBD = new BigDecimal(0);
//        if (proManager != 0 && proTrain != 0) {
//            double ret = proTrainManager / proTrain;
//            if (ret < 0.6) {
//                proTrainBD = new BigDecimal(Figure.ZERO);
//            } else if (ret >= 0.6 && ret < 0.8) {
//                proTrainBD = new BigDecimal(Figure.ONE);
//            } else if (ret >= 0.8) {
//                proTrainBD = new BigDecimal(Figure.TWO);
//            }
//        }
//        jc04 = jc04.add(proTrainBD);
//
//        //jc_05
//        // 企业经营情况
//        CorpVO corpVO = corpDao.getCorpOperate(corpId);
//        BigDecimal contract = new BigDecimal(0);
//        //其他经营年限
//        if (corpVO.getYear() == null) {
//            jc05 = new BigDecimal(Figure.ZERO);
//        } else {
//            Calendar calendar = Calendar.getInstance();
//            int nowYear = calendar.get(Calendar.YEAR);
//            int jisuan = nowYear - corpVO.getYear();
//            if (jisuan < 2) {
//                jc05 = new BigDecimal(Figure.ZERO);
//            } else if (jisuan >= 2 && jisuan < 4) {
//                jc05 = new BigDecimal(Figure.ONE);
//            } else if (jisuan >= 4 && jisuan < 6) {
//                jc05 = new BigDecimal(Figure.TWO);
//            } else if (jisuan >= 6) {
//                jc05 = new BigDecimal(Figure.THREE);
//            }
//            if (StringUtils.isNotBlank(corpVO.getCreditContractPath())) {
//                //是否是重合同守信用企业
//                contract = new BigDecimal(Figure.ONE);
//            }
//        }
//        jc05 = jc05.add(contract);
//        //jc_06
//        // 物业管理面积
//        Integer area = corpDao.getCorpArea(corpId);
//        if (area != null) {
//            if (area >= 30 && area < 60) {
//                jc06 = new BigDecimal(Figure.ONE);
//            } else if (area >= 60 && area < 90) {
//                jc06 = new BigDecimal(Figure.TWO);
//            } else if (area >= 90 && area < 120) {
//                jc06 = new BigDecimal(Figure.THREE);
//            } else if (area >= 120) {
//                jc06 = new BigDecimal(Figure.FOUR);
//            } else {
//                jc06 = new BigDecimal(Figure.ZERO);
//            }
//        } else {
//            jc06 = new BigDecimal(Figure.ZERO);
//        }
//        //jc_07
//        // 参与保障性住房、老旧小区等物业服务
//        Integer baozhang = corpDao.getCorpBZArea(corpId);
//        if (baozhang != null) {
//            if (baozhang >= Common.FIVE && baozhang < Common.TEN) {
//                jc07 = new BigDecimal(Figure.ONE);
//            } else if (baozhang >= Common.TEN) {
//                jc07 = new BigDecimal(Figure.TWO);
//            } else {
//                jc07 = new BigDecimal(Figure.ZERO);
//            }
//        } else {
//            jc07 = new BigDecimal(Figure.ZERO);
//        }
//        scoreRecord.setJc01(jc01);
//        scoreRecord.setJc02(jc02);
//        scoreRecord.setJc03(jc03);
//        scoreRecord.setJc04(jc04);
//        scoreRecord.setJc05(jc05);
//        scoreRecord.setJc06(jc06);
//        scoreRecord.setJc07(jc07);
//------------------------------基础算分结束------------------------------------------------
}
